-- ==== BEGIN LICENSE BLOCK ====
-- storyboard-addon - Copyright (C) Arnaud Charnoz, 2006-2010.
-- Distributed under the terms of the GNU Lesser General Public License (LGPL) as
-- published by the Free Software Foundation.
-- ===== END LICENSE BLOCK ====


StoryBoard = LibStub("AceAddon-3.0"):NewAddon("StoryBoard", "AceConsole-3.0", "AceEvent-3.0","AceSerializer-3.0","AceComm-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("StoryBoard")

StoryBoard.currentStoryline = nil;
StoryBoard.storylineDB = nil;
StoryBoard.SHARE_STORYLINE_EVENT = "StoryBoard_SHARE_STORYLINE";

local options = {
    name = "StoryBoard",
    handler = StoryBoard,
    type = "group",
    args = {
        msg = {
            type = "input",
            name = L["Message"],
            desc = L["The message to be displayed when you get home."],
            usage = L["<Your message>"],
            get = "GetMessage",
            set = "SetMessage",
        },
        showInChat = {
            type = "toggle",
            name = L["Show in Chat"],
            desc = L["Toggles the display of the message in the chat window."],
            get = "IsShowInChat",
            set = "ToggleShowInChat",
        },
        showOnScreen = {
            type = "toggle",
            name = L["Show on Screen"],
            desc = L["Toggles the display of the message on the screen."],
            get = "IsShowOnScreen",
            set = "ToggleShowOnScreen",
        },
    },
}

local defaults = {

    profile =  {
        message = L["Welcome Home!"],
        showInChat = false,
        showOnScreen = true,
        savedStoryline = nil,
        savedStorylineDB_db = nil,
        tutorialStoryline = "^1^T^N1^STuto~`I~`-~`L'enchanteur^N2^N3^N3^Sv3~`(Fr)~`17/06/2010^N4^SMakao,~`La~`Croisade~`Ecarlate~`(Fr)^N5^SGypsie,~`LCE~`(Fr)~`(Merci~`pour~`les~`corrections)^N6^Snon~`renseigné^N7^SMyPassword^N8^Snone^N9^Slevel~`10~`minimun^N10^SPouvoir~`se~`rendre~`à~`Dalaran^N11^SPetit~`début~`d'histoire~`bidon~`servant~`à~`illustrer~`les~`possibiltés~`de~`cet~`addon,~`bonne~`découverte.^N12^SUne~`mission~`vous~`attends.~`Rendez~`vous,~`dans~`la~`halle~`des~`mages~`dans~`la~`citée~`de~`Dalaran.~`Prêt~`de~`l'apothicaire~`agronomique,~`vous~`trouverez~`une~`boîte~`aux~`lettres.~`Un~`courrier~`vous~`y~`attends.~`Discrétion~`est~`mère~`de~`sureté.^N13^T^N1^T^N1^SBon~`portrait^N2^SNorfendre^N3^SDalaran^N4^SLa~`Miraclerie^N5^N0.429848^N6^N0.469577^N7^N0.006849^N8^S<~`Oh...~`un~`magnifique~`portrait~`est~`accroché~`au~`mur.~`Il~`représente~`une~`jeune~`humaine.~`Ce~`visage~`ne~`vous~`est~`pas~`inconnu,~`sûrement~`une~`aristocrate~`de~`Dalaran~`que~`vous~`avez~`déjà~`croisé,~`peut-être~`tué~`?~`...~J~J<~`Pendant~`votre~`observation,~`des~`traces~`de~`doigts~`sur~`la~`poussière~`du~`cadre~`attirent~`votre~`regard.~`Il~`semble~`que~`le~`portrait~`a~`été~`déplacé~`récemment.~`N'écoutant~`que~`votre~`audace~`(~`le~`propriétaire~`des~`lieux~`n'est~`pas~`réputé~`pour~`être~`des~`plus~`aimables~`),~`vous~`profitez~`d'un~`bref~`instant~`d'inattention~`du~`gérant~`de~`la~`boutique~`pour~`décrochez~`le~`tableau.~`A~`son~`dos,~`vous~`y~`trouvez~`attaché~`un~`ancien~`morceau~`de~`parchemin.~`Après~`avoir~`tiré~`de~`votre~`sac~`le~`morceau~`récupéré~`dans~`l'aquarium,~`vous~`constatez~`que~`ce~`dernier~`complète~`parfaitement~`la~`moitié~`de~`la~`formule~`en~`votre~`possession~`(même~`si~`vous~`ne~`comprenez~`pas~`grand~`chose~`à~`tout~`ce~`charabiat).~`>~J~JMISSION~`ACCOMPLIE~J~J[~`Ceci~`était~`juste~`un~`test~`temporaire,~`plus~`prochainement~`dans~`les~`prochaines~`éditions~`]~`^t^N2^T^N1^SMénagerie~`magique_574_378^N2^SNorfendre^N3^SDalaran^N4^SMénagerie~`magique^N5^N0.574541^N6^N0.378984^N7^N0.01065^N8^S<~`Vous~`remarquez~`un~`gnome~`atypique~`se~`balladant~`dans~`un~`aquarium....~`le~`fameux~`plongeur~`de~`Dalaran.~`Vous~`vous~`approchez~`de~`ce~`dernier~`qui~`vous~`regarde~`d'un~`air~`suspicieux...~`il~`fixe~`étrangement~`le~`coffre,~`puis~`vous~`regarde~`à~`nouveau,~`puis~`tatone~`ses~`clefs~`accrochées~`à~`sa~`taille.~`Vraiment~`pas~`rassuré~`le~`jeune~`homme,~`sûrement~`votre~`côté...~`comment~`dire...~`imposant~`!~`Vous~`lui~`dîtes~`bonjour,~`avec~`un~`grand~`sourire~`et~`vous~`continuez~`d'admirer~`son~`bel~`aquarium~`en~`lui~`posant~`des~`questions~`pour~`l'apaiser,~`le~`distraire,~`fourbe~`que~`vous~`êtes~`...~`>~J~J<~`Quelques~`minutes~`plus~`tard,~`pendant~`qu'il~`vous~`tourne~`le~`dos~`tourne~`pour~`ramasser~`une~`étoile~`de~`mer,~`vous~`l'assomez,~`prenez~`ses~`clés~`et~`inspectez~`le~`coffre~`à~`ses~`côtés.~`Vous~`y~`découvrez~`deux~`morceaux~`de~`parchemins~`dans~`une~`boîte~`imperméable.~`Le~`premier~`représente~`un~`semblant~`de~`formule~`magique~`sur~`une~`demi-page.~`L'autre~`est~`une~`note~`d'un~`prénommé~`Sir~`Hanguemat.~`>~J~J[~`début~`de~`note~`]~J~JMon~`cher~`ami,~J~JCette~`nouvelle~`formule~`doit~`être~`cachée....~`séparée...~`certaines~`personnes~`puissantes~`ici~`aimeraient~`la~`récupérer.~J~JGarde~`la~`mon~`ami.~J~JSir~`Hanguemat.~J~JPS~`:~`Au~`cas~`où...~`il~`m'arrive~`quelque~`chose...~`l'autre~`partie~`se~`trouve...~`hum~`si~`ce~`je~`te~`dis~`:~`tchou~`tchou~`!~`et~`maintenant~`si~`je~`te~`dis~`:~`portrait~`réalisée~`par~`sohpia...~`haha~`tu~`brûles~`!~J~J[~`fin~`de~`note~`]~J~J<~`Vous~`refermez~`le~`coffre~`en~`gardant~`les~`papiers,~`remettez~`les~`clefs~`à~`leur~`place,~`et~`sortez~`vite~`du~`magasin~`avant~`que~`sir~`le~`plongeur~`ridicule~`ne~`se~`réveille~`>^t^N3^T^N1^SLa~`Miraclerie_449_472^N2^SNorfendre^N3^SDalaran^N4^SLa~`Miraclerie^N5^N0.449385^N6^N0.472059^N7^N0.008058^N8^S<~`Devant~`vous~`se~`dresse~`le~`portrait~`d'une~`ravissante~`elfette~`(message~`à~`caractère~`subliminal~`:~`Mort~`aux~`Elfes~`!),~`après~`une~`observation~`minutieuse,~`vous~`ne~`trouvez~`rien~`de~`particulier~`>^t^N4^T^N1^SLa~`halle~`des~`mages_404_325^N2^SNorfendre^N3^SDalaran^N4^SLa~`halle~`des~`mages^N5^N0.404206^N6^N0.325224^N7^N0.015291^N8^S<~`Un~`message,~`de~`destination~`inconue,~`vous~`est~`adressé~`>~J~JBonjour~`citoyen(e)~`de~`Dalaran,~`grand(e)~`aventurier(e)~`!~`Votre~`réputation~`vous~`précède,~`le~`consortium~`a~`besoin~`de~`vous...~`pour~`le~`bien~`du~`peuple~`évidemment.~J~JIl~`semblerait~`que~`vous~`travaillez~`rapidement~`et~`surtout~`sans~`vous~`faire~`remarquer.~`Nous~`avons~`un~`travail~`à~`vous~`proposez~`si~`vous~`avez~`un~`peu~`de~`temps...~J~JSir~`Hanguemat~`est~`(petit~`de~`taille,~`mouarff~`c'est~`un~`gnome)~`un~`grand~`enchanteur~`de~`Dalaran~`que~`vous~`ne~`connaissez~`peut~`être~`pas,~`c'est~`plutôt,~`comment~`le~`décrire...~`un~`artisan~`méconnu,~`mais~`un~`artisan~`très~`doué,~`trop~`doué,~`trop~`mystérieux...~`Il~`a~`inventé~`récemment~`une~`toute~`nouvelle~`formule~`que~`nous~`aimerions~`récupérer.~`Il~`ne~`faudrait~`pas~`qu'une~`telle~`formule~`tombe~`dans~`de~`mauvaise~`main,~`cependant~`Sir~`Hanguemat~`n'est~`pas~`du~`genre~`coopératif.~J~JNous~`avons~`entendu~`dire~`qu'il~`allait~`souvent~`à~`l'animalerie~`de~`Dalaran,~`trop~`souvent...~`ces~`gnomes~`alors...~`Vous~`devriez~`peut~`être~`commencer~`vos~`recherches~`là~`bas.~J~JNous~`comptons~`sur~`votre~`collaboration~`!~J~JAvec~`nos~`remerciements.~J~JLe~`consortium.^t^t^SversionData^N1^t^^",
    },
}
    
function StoryBoard:OnInitialize()
    -- Called when the addon is loaded
    self.db = LibStub("AceDB-3.0"):New("StoryBoardDB", defaults, "Default")

    LibStub("AceConfig-3.0"):RegisterOptionsTable("StoryBoard", options)
    self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("StoryBoard", "StoryBoard")
    self:RegisterChatCommand("sb", "ChatCommand")
    self:RegisterChatCommand("storyboard", "ChatCommand")

end


function StoryBoard:OnEnable()

    -- Called when the addon is enabled
     self:RegisterComm( StoryBoard.SHARE_STORYLINE_EVENT, "OnShareStorylineEvent" );
     
    -- Load storyline db 
    self.storylineDB = StorylineDB:new();
    if ( self.db.profile.savedStorylineDB_db ~= nil )
    then
        self.storylineDB.db = self.db.profile.savedStorylineDB_db;
    else
        self.db.profile.savedStorylineDB_db = self.storylineDB.db;
    end
    
    -- Load storyline tutorial and add in storyline db
    local tuto = Storyline:new();
    tuto:importFromString( self.db.profile.tutorialStoryline );
    self.storylineDB:addStoryline( tuto );
    
    
    -- self.db.profile.savedStoryline
    
    if ( self.db.profile.savedStoryline ~= nil )
    then
        if self.storylineDB:hasKey( self.db.profile.savedStoryline )
        then
            self.currentStoryline = self.storylineDB:getStoryline( self.db.profile.savedStoryline );
        else
            self.currentStoryline = tuto;
        end
    else
       self.currentStoryline = tuto;
    end


    

    self.db.profile.version = 131;
    self.db.profile.textVersionTexte = "version 1.3.1 (15/07/2010)";
    
    -- Starts/Configures controllers
    sb.ui.MenuEditorController:init();
    sb.ui.MenuEditorController:setStoryline( self.currentStoryline );
    sb.ui.MenuEditorController:setStorylineDB( self.storylineDB );
    
    sb.ui.MenuGameController:init();
    
    sb.ui.StorylineDBManagerController:init();
    sb.ui.StorylineDBManagerController:setStorylineDB( self.storylineDB );
    sb.ui.StorylineDBManagerController:setSelectedStoryline( self.currentStoryline );
    
end


function StoryBoard:OnDisable()
    -- Called when the addon is disabled
    --self.db.profile.savedStorylineDB_db = self.storylineDB.db;
end


function StoryBoard:ZONE_CHANGED()
    if GetBindLocation() == GetSubZoneText() then
        if self.db.profile.showInChat then
            self:Print(self.db.profile.message)
        end

        if self.db.profile.showOnScreen then
            UIErrorsFrame:AddMessage(self.db.profile.message, 1.0, 1.0, 1.0, 5.0)
        end
    end
end

function StoryBoard:ChatCommand(input)
    if not input or input:trim() == "" then
        InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
    else
        LibStub("AceConfigCmd-3.0").HandleCommand(StoryBoard, "sb", "StoryBoard", input)
    end
end

function StoryBoard:GetMessage(info)
    return self.db.profile.message
end

function StoryBoard:SetMessage(info, newValue)
    self.db.profile.message = newValue
end

function StoryBoard:IsShowInChat(info)
    return self.db.profile.showInChat
end

function StoryBoard:ToggleShowInChat(info, value)
    self.db.profile.showInChat = value
end

function StoryBoard:IsShowOnScreen(info)
    return self.db.profile.showOnScreen
end

function StoryBoard:ToggleShowOnScreen(info, value)
    self.db.profile.showOnScreen = value
end

-------------------------------------------------------------------------------

function StoryBoard:OnShareStorylineEvent( prefix, message, distribution, sender )

    local storyline = Storyline:new();
    storyline:importFromString( message );
    local storylineId = storyline:getId();
    
    if self.storylineDB:hasKey( storylineId )
    then
        SBMessageManager:debugMessage( "Sorry this stolyline already exist ");
    else
        self.storylineDB:addStoryline( storyline );
    end
    
end

-------------------------------------------------------------------------------
